home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / utility / utilcli / abortpkt.lzh / AbortPkt / abortpkttest.c < prev    next >
C/C++ Source or Header  |  1996-11-07  |  4KB  |  179 lines

  1.  
  2. #include <dos/dos.h>
  3. #include <dos/dosextens.h>
  4. #include <dos/rdargs.h>
  5. #include <exec/memory.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8.  
  9. #include "action_abort.h"
  10.  
  11. UBYTE *JTName = "AbortPktPatch-JT";
  12.  
  13. BPTR
  14. LockAndOpenFile (char *file, char *device)
  15. {
  16.   BPTR lock, dlock, fh = NULL;
  17.   int ret;
  18.  
  19.   if (!(lock = Lock (file, ACCESS_READ)))
  20.   {
  21.     printf ("No such file.\n");
  22.     return NULL;
  23.   }
  24.   if (!(dlock = Lock (device, ACCESS_READ)))
  25.   {
  26.     printf ("Can't lock device \"%s\".\n", device);
  27.     return NULL;
  28.   }
  29.   ret = SameLock (lock, dlock); // Can't use dp -> dvp_Lock here!?
  30.   UnLock (dlock);
  31.  
  32.   if (ret == LOCK_SAME || ret == LOCK_SAME_VOLUME)
  33.     fh = OpenFromLock (lock);
  34.   else
  35.   {
  36.     if (ret == LOCK_DIFFERENT)
  37.       printf ("\n\"%s\" is not on \"%s\".\n\n", file, device);
  38.     else
  39.       printf ("Lock() returned unknown lock status.\n");
  40.     UnLock (lock);
  41.     return NULL;
  42.   }
  43.   return fh;
  44. }
  45.  
  46. void
  47. SendAndAbort (struct DevProc *dp, int use_patch, char *device, char *file)
  48. {
  49.   struct StandardPacket *spr = NULL;
  50.   struct StandardPacket *spa = NULL;
  51.   struct MsgPort *port = dp -> dvp_Port;
  52.   struct MsgPort *mpr = NULL;
  53.   struct MsgPort *mpa = NULL;
  54.   void *buffer;
  55.   ULONG mask;
  56.   int out = 0;
  57.   BPTR fh;
  58.  
  59.   if (file)
  60.   {
  61.     if (!(fh = LockAndOpenFile (file, device)))
  62.       return;
  63.   }
  64.   if (!(mpr = CreatePort (NULL, 0)))
  65.     goto cleanup;
  66.  
  67.   if (!(mpa = CreatePort (NULL, 0)))
  68.     goto cleanup;
  69.  
  70.   if (!(spr = AllocMem (sizeof (struct StandardPacket), MEMF_CLEAR | MEMF_PUBLIC)))
  71.     goto cleanup;
  72.  
  73.   if (!(spa = AllocMem (sizeof (struct StandardPacket), MEMF_CLEAR | MEMF_PUBLIC)))
  74.     goto cleanup;
  75.  
  76.   if (!(buffer = AllocMem (16, MEMF_PUBLIC)))
  77.     goto cleanup;
  78.  
  79.   spr -> sp_Msg.mn_Length = sizeof (struct StandardPacket);
  80.   spr -> sp_Msg.mn_Node.ln_Name = (char *) &spr -> sp_Pkt;
  81.   spr -> sp_Pkt.dp_Link = &spr -> sp_Msg;
  82.   spr -> sp_Pkt.dp_Port = mpr;
  83.   spr -> sp_Pkt.dp_Type = ACTION_READ;
  84.   spr -> sp_Pkt.dp_Arg1 = ((struct FileHandle *) BADDR (fh)) -> fh_Arg1;
  85.   spr -> sp_Pkt.dp_Arg2 = buffer;
  86.   spr -> sp_Pkt.dp_Arg3 = 16;
  87.   SendPkt (&spr -> sp_Pkt, port, mpr);
  88.   out ++;
  89.   
  90.   if (use_patch)
  91.   {
  92.     printf ("Calling AbortPkt () ...\n");
  93.     AbortPkt (port, &spr -> sp_Pkt);
  94.     printf ("AbortPkt () ... done.\n");
  95.   }
  96.   else
  97.   { 
  98.     spa -> sp_Msg.mn_Length = sizeof (struct StandardPacket);
  99.     spa -> sp_Msg.mn_Node.ln_Name = (char *) &spa -> sp_Pkt;
  100.     spa -> sp_Pkt.dp_Link = &spa -> sp_Msg;
  101.     spa -> sp_Pkt.dp_Port = mpa;
  102.     spa -> sp_Pkt.dp_Type = ACTION_ABORT;
  103.     spa -> sp_Pkt.dp_Arg1 = &spr -> sp_Pkt;
  104.     SendPkt (&spa -> sp_Pkt, port, mpa);
  105.     out ++;
  106.   }
  107.   
  108.   mask = 1 << mpr -> mp_SigBit | 1 << mpa -> mp_SigBit;
  109.  
  110.   while (out)
  111.   {
  112.     Wait (mask);
  113.     if (GetMsg (mpr))
  114.     {
  115.       printf ("ACTION_READ returned.\n");
  116.       out --;
  117.     }
  118.     if (GetMsg (mpa))
  119.     {
  120.       if (spa -> sp_Pkt.dp_Res1 == DOSTRUE)
  121.         printf ("\nACTION_ABORT is supported and was successful.\n");
  122.       else if (spa -> sp_Pkt.dp_Res2 == ERROR_OBJECT_NOT_FOUND)
  123.         printf ("\nACTION_ABORT is supported but failed.\n");
  124.       else if (spa -> sp_Pkt.dp_Res2 == ERROR_ACTION_NOT_KNOWN)
  125.         printf ("\nACTION_ABORT is not implemented by this device.\n");
  126.       else
  127.         printf ("\nACTION_ABORT: Unexpected error %d.\n", spa -> sp_Pkt.dp_Res2);
  128.       out --;
  129.     }
  130.   }
  131.  
  132.   cleanup:
  133.  
  134.   if (fh) Close (fh);
  135.   if (buffer) FreeMem (buffer, 16);
  136.   if (mpr) DeletePort (mpr);
  137.   if (mpa) DeletePort (mpa);
  138.   if (spr) FreeMem (spr, sizeof (struct StandardPacket));
  139.   if (spa) FreeMem (spa, sizeof (struct StandardPacket));
  140. }
  141.  
  142. int
  143. main (int argc, char *argv[])
  144. {
  145.   struct DevProc *dp;
  146.   struct RDArgs *rda;
  147.   LONG ar[3] = { 0,0,0 };
  148.   char *template = "P=USEPATCH/S,H=HANDLER/K/A,F=FILE/K";
  149.   char *device, *file;
  150.   int use_patch;
  151.  
  152.   if (!(rda = ReadArgs (template, ar, NULL)))
  153.   {
  154.     printf ("%s: required argument missing.\n  Template: %s\n", argv[0], template);
  155.     exit (0);
  156.   }
  157.   use_patch = ar[0];
  158.   device = (char *) ar[1];
  159.   file = (char *) ar[2];
  160.  
  161.   if (use_patch)
  162.   {
  163.     if (!FindSemaphore (JTName))
  164.     {
  165.       printf ("AbortPktPatch is not installed.\n");
  166.       exit (0);
  167.     }
  168.   }
  169.   if (device[strlen(device)-1] == ':' && (dp = GetDeviceProc (device, NULL)))
  170.   {
  171.     SendAndAbort (dp, use_patch, device, file);
  172.     FreeDeviceProc (dp);
  173.   }
  174.   else
  175.     printf ("No such device.\n");
  176.  
  177.   FreeArgs (rda);
  178. }
  179.